package com.butang.code.arrayList;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import java.sql.Array;
import java.util.Arrays;
import java.util.function.IntConsumer;
import java.util.stream.IntStream;

/**
 * ClassName: CLP40
 * Package: com.butang.code.arrayList
 * Description:
 *
 * @Author BuTang
 * @Create 2024/8/1 9:20
 * @Version 1.0
 */
public class CLP40 {
    /**
     * 「力扣挑战赛」心算项目的挑战比赛中，要求选手从 N 张卡牌中选出 cnt 张卡牌，若这 cnt 张卡牌数字总和为偶数，则选手成绩「有效」且得分为 cnt 张卡牌数字总和。 给定数组 cards 和 cnt，其中 cards[i] 表示第 i 张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案，则返回 0。
     * 示例 1：
     * 输入：cards = [1,2,8,9], cnt = 3
     * 输出：18
     * 解释：选择数字为 1、8、9 的这三张卡牌，此时可获得最大的有效得分 1+8+9=18。
     *
     * 示例 2：
     * 输入：cards = [3,3,1], cnt = 1
     * 输出：0
     * 解释：不存在获取有效得分的卡牌方案。
     *
     * 提示：
     * 1 <= cnt <= cards.length <= 10^5
     * 1 <= cards[i] <= 1000
     */
    public static void main(String[] args) {

//        int[] ints = {1, 2, 8, 9};
//        int[] ints = {2, 2, 2, 2};
//        int[] ints = {1, 4, 7};
//        int[] ints = {9,5,9,1,6,10,3,4,5,1};
//        int[] ints = {3,3,1};
        int[] ints = {9,5,9,1,6,10,3,4,5,1};
        System.out.println(maxmiumScore(ints,2));
    }

    public static int maxmiumScore(int[] cards, int cnt) {

        Arrays.sort(cards);
        int sum = 0;
        int length = cards.length;
        int returnValue = 0;

        for (int i = 1; i <= cnt  ; i++) {
            sum += cards[length-i];
        }

        if (sum % 2 == 0){
            return sum;
        }

        int replaceValue1 = cards[length-cnt];
        returnValue = replaceSum(cards,cnt,sum,replaceValue1);
        for (int i = length -cnt +1 ; i <= length -1 ; i++) {
            if (replaceValue1 % 2 != cards[i] % 2){
                returnValue = Integer.max(returnValue , replaceSum(cards,cnt,sum,cards[i]));
            }
        }
        return returnValue;
    }

    /**
     * 向左寻找一个与被替换值奇偶性不同的数
     * @param cards 从小到大排序后的数组
     * @param cnt 个数
     * @param sum 之前最大的和
     * @param replaceNum 被替换的值
     * @return
     */
    private static int replaceSum(int[] cards, int cnt, int sum, int replaceNum){
        for (int i = cards.length - cnt -1; i >=0 ; i--) {
            if (cards[i] % 2 != replaceNum %2 ){
                return sum - replaceNum + cards[i];
            }
        }
        return 0;
    }
}
